#include<iostream>
#include<cstdio.h>
#include<cassert>
#include<vector>
#include<sys/epoll.h>
#include "tcpsocket.hpp"

#define MAX_EVENTS 10
class Epoll{
private:
  int _epfd;
public:
  Epoll():_epfd(-1){
    _epfd=epoll_create(1) ;     //创建 epoll 结构
    assert(_epfd!=-1);
  }
  bool Add(TcpSocket& sock){     //开始添加要监控的描述符
     int fd=sock.GetFd();

     struct epoll_event ev;     //定义一个 epoll 事件结构体对象
     ev.events=EPOLLIN;       //监控可读事件
     ev.data.fd=fd;         //要监控的描述符

     int ret = epoll_ctl(_epfd,EPOLL_CTL_ADD,fd,&ev);      //添加
     if(ret<0){
        if(errno==EEXIST){
             retrun true;
        }
        perror("epoll add error!\n");
        return false;
     }
     return true;
  }

  bool Del(TcpSocket& sock){
     int fd=sock.GetFd();
     int ret=epoll_ctl(_epfd,EPOLL_STL_DEL,fd,NULL);     //移除监控的描述符
     if(ret<0){
        if(errno==ENOENT){
            return true;
        }
        perror("epoll del error!\n");
        return false;
     }
     return true;
  }
  //开始监控
  bool Wait(std::vector<TcpSocket>* active_socket,int ms){
    struct epoll_event evs[MAX_EVENTS];
    int ret=epoll_wait(_epfd,evs,MAX_EVENTS,ms);
    if(ret<0){
       perror(""epoll wait error!\n);
       return false;
    }else if(ret==0){
       printf("epoll timeout!\n");
       return true;
    }
    
    for(int i=0;i<ret;++i){
      if(evs[i].events & EPOLLIN){
         TcpSocket sock(evs[i].data.fd);
         active_socket->push_back(sock);
      }
    }
    return true;
  }
};
